Date : 15/4/94
Protection : MOT DE PASSE
Programme : STARLORD (VF)
Outils : SOFT-ICE V2.50
Fichier :
Temps pass� : 15mn
Soci�t� : Microprose
Origine : C.D.
Divers :
Num�ro : 9
Pas trop difficile � cracker, le plus difficile ayant �t� de lib�rer
assez de m�moire pour pouvoir lancer SOFT-ICE en m�me temps que le
jeu (en mettant BUFFERS = 5, j'ai lib�r� une quantit� suffisante de
m�moire pour le faire). La routine de code est relativement courte,
et en prenant du recul, on trouve le CALL responsable de cette routine.
Juste apr�s se trouve un CMP puis un saut, saut qu'il a suffit d'inver-
ser.
4DBA:09A7 7502 JNZ 09AB ; --> devient JZ 09AB
C�dric
; PATCH POUR LE PROGRAMME STARLORD.
;******************************************************************************
; ZONE A INITIALISER
adr_ip1 equ 09A7h ; Adresse dont le contenu est � modifier.
anc_val equ 0275h ; Valeur d'origine � rechercher, invers�e.
nouv_val equ 0274h ; Nouvelle valeur (la modif).
INT_DET equ 21h ; Le num�ro de l'INT que l'on veut utiliser.
BEEP_TONE equ 440 ; Fr�quence de la note.
nb equ 30 ; Nombre de d�pilage.
;******************************************************************************
seg_a segment byte public
assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
org 100h
sto proc far
start:
jmp init ; r�duire la m�moire et d�placer la
db 90h ; pile plus pr�s.
paramet dw 0 ; M�me bloc d'environnement.
ENVIR dw 0 ; Les param�tres de la ligne de
data_3 dw 0 ; commande sont recopi�s ici puis
FCB_1 dw 0 ; transmis au programme fils. ( 80h )
data_5 dw 0
FCB_2 dw 0
data_7 dw 0
sauve_SP dw 0
sauve_SS dw 0
data_9 dw 0, 0
drap equ 0
;------------------------------ PROGRAMME PERE ------------------------------
loc_1: mov sauve_SP,sp
mov sauve_SS,ss
mov ax,80h
mov ENVIR,ax ; Ligne de commande...
mov data_3,ds
mov ax,5Ch ; Premier FCB ( inutilis� )
mov FCB_1,ax
mov data_5,ds
mov ax,6Ch ; Second FCB ( inutilis� )
mov FCB_2,ax
mov data_7,ds
mov ah,35h
mov al,INT_DET
int 21h ; DOS Services ah=function 35h
; get intrpt vector al in es:bx
mov cs:data_9,bx
mov word ptr cs:data_9+2,es
mov ah,25h
mov al,INT_DET
lea dx,cs:[_int] ; Load effective addr
int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
lea dx,cs:[nom_prg] ; Load effective addr
push ds
pop es
lea bx,cs:[paramet] ; Load effective addr
mov al,0
mov ah,4Bh
int 21h ; Appel du programme fils.
; run progm @ds:dx, parm @es:bx
mov sp,sauve_SP
mov ss,sauve_SS
cmp al,2 ; teste le code de retour du programme
jnz ok ; fils, 02 si pas trouv�.
mov dx,offset mess_err
mov ah,9
int 21h
; Les cinq instructions suivantes sont facultatives puisque le
; vecteur d'origine est remis en place d�s que le patch est effectu�.
; Le seul but est d'�viter le plantage du PC dans l'hypoth�se o� l'on
; lance le programme p�re et que celui-ci ne trouve pas le programme
; fils. A ce moment l� on remet tout en place et on quitte.
ok: mov ah,25h
mov al,INT_DET
mov dx,cs:data_9
mov ds,word ptr cs:data_9+2
int 21h
mov ah,4Ch
int 21h ; terminate with al=return code
sto endp
;---------------------------- int d�tourn�e --------------------------------
int_entry proc far
_int: jmp apres
_SAUVE_SP dw 0,0
apres: push ax
push ds
push bx
push cx
push dx
pushf ; Push flags
ifdef sous_f
cmp ah,sous_f
jnz sort
endif
mov word ptr cs:[_SAUVE_SP],sp
mov cx,nb
prochain: pop ds
dec cx
jz s
cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche.
jnz prochain
mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch.
xor bx,bx
mov ds,bx
; L'INT 21 n'est pas r�entrante, on ne peut donc pas se servir de
; la fonction 25h ( set int. vector )
mov bx,word ptr cs:data_9 ; Je remets manuellement
mov ds:[INT_DET*4],bx ; en place le vecteur
mov bx,word ptr cs:data_9+2 ; de l'INT d�tourn�e.
mov ds:[INT_DET*4+2],bx
;* Sound - Sounds speaker with the following tone and duration:
mov al, 0B6h ; Initialize channel 2 of
out 43h, al ; timer chip
mov dx, 12h ; Divide 1,193,180 hertz
mov ax, 34DCh ; (clock frequency) by
mov bx, BEEP_TONE ; desired frequency
div bx ; Result is timer clock count
out 42h, al ; Low byte of count to timer
mov al, ah
out 42h, al ; High byte of count to timer
mov bx,3 ; Charge BX avec 3 BEEPs
main_b: in al, 61h ; Read value from port 61h
or al, 3 ; Set first two bits
out 61h, al ; Turn speaker on
mov dx,3
rebou: mov cx, 0ffffh
bou: loopnz bou
dec dx
jnz rebou
in al, 61h ; When time elapses, get port value
xor al, 3 ; Kill bits 0-1 to turn
out 61h, al ; speaker off
dec cx
bou1: loopnz bou1
dec bx ; Compteur de boucle.
jnz main_b ; Trois bips...
s: mov sp,word ptr cs:[_SAUVE_SP]
sort: popf
pop dx
pop cx
pop bx
pop ds
pop ax
jmp dword ptr cs:data_9
int_entry endp
;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------
init: ; D�codage du texte.
cld ; Pour incr�menter SI et DI.
xor ax,ax
mov si,offset chaine ; pointe sur le d�but de la chaine.
mov di,si ; DI �galement.
mov cx,offset chaine_fin - offset chaine
; 28 lignes de 6 caract�res sont XOR�s.
; + mess_err ( 30 ) + nom_prog ( 13 ).
toto: lodsb ; On cherche...
xor al,ah ; On XOR.
stosb ; On remet.
xchg ah,al
loop toto ; Et on tourne tant que CX # 0.
mov ax,1a00h ; Test si carte + moniteur VGA
int 10h
cmp al,1ah
je graf ; Si oui on affiche la fen�tre FREDDY_SOFT.
mov ah,12h ; Test EGA. INT 10 sf 12 ssf 10
mov bl,10h
mov bh,0ffh
int 10h
cmp bh,0ffh ; Si # de 0ffh on a une carte EGA ou...
jnz graf ; mieux !
suite1: mov ah,4ah
mov bx,offset fin ; Fin du programme en BX.
mov cl,4 ; Divis� par 4 pour avoir des paragraphes.
shr bx,cl
inc bx ; On en rajoute un par s�curit�.
int 21h ; Execution de la fonction 4Ah.
mov sp,offset fin ; on d�place la pile en "fin" car elle est
jmp loc_1 ; plac�e en FFFE dans un programme COM.
graf: ; Raz de l'�cran
mov ax,3
int 10h
mov ax,1301h ; Mode 01 attribut couleur dans BL.
mov bx,004bh ; Page 0.
mov cx,28 ; nombre de char.
mov dx,0a19h ; ligne,colonne.
lea bp,cs:[chaine]
ligne_suiv: int 10h
inc dh
add bp,28
cmp dh,10h ; 6 lignes de 28 caract�res.
jb ligne_suiv
mov ah,2 ; Pour faire disparaitre le curseur.
xor bh,bh ; Page ecran 0.
mov dh,25
int 10h
xor ah,ah
int 16h ; Attend un char...
mov cx,30
; Attend le retour ligne...
vibre: mov dx,3dah
in1: in al,dx
test al,8
jnz in1
in2: in al,dx
test al,8
jz in2
cli ; D�cale d'un pixel.
mov dx,3c0h
mov al,33h
out dx,al
mov al,2
out dx,al
sti
mov dx,3dah
in3: in al,dx
test al,8
jnz in3
in4: in al,dx
test al,8
jz in4
cli ; D�cale d'un pixel.
mov dx,3c0h
mov al,33h
out dx,al
mov al,0ffh
out dx,al
sti
dec cx
jnz vibre
jmp suite1
db 55h,0aah ; Identificateur de d�but.
chaine: db '�����������CEDRIC���������Ŀ'
db '� �'
db '� STARLORD Bypass �'
db "� I hope you'll enjoy it �"
db '� �'
db '��� Lan�eur Crypt� V1.1 ����'
mess_err db 0ah,0dh,'Programme enfant non trouv�','$'
nom_prg db 'super.exe',0,0,0,0 ; 12 car max + nul
chaine_fin: db 0aah,55h ; Identificateur de fin.
fin_init label near
;----------------------- PLACE RESERVEE POUR LA PILE ------------------------
dw 100 dup (' ')
fin equ this byte ; ici le sommet de la pile, SP.
seg_a ends
end start
|